package linker

// ContextArgs 保存输出文件、机器类型、库文件路径等基本信息
type ContextArgs struct {
	OutPut       string
	Emulation    MachineType
	LibraryPaths []string
}

// Context 链接器需要的上下文信息
type Context struct {
	Args ContextArgs
	Buf  []byte //最终要写到文件中的内容 文件缓冲区

	ELFHeader     *OutPutELFHeader     // 控制输出 ELF 文件头
	SectionHeader *OutPutSectionHeader // 控制输出 SectionHeaderTable

	OutPutSections []*OutPutSection     // 控制输出 Section
	ProgramHeader  *OutPutProgramHeader // 控制输出 ProgramHeaderTable

	TpAddr         uint64             // thread local pointer address
	Got            *GotSection        // 全局偏移量表
	Chunks         []Chunker          // Chunker 接口
	ObjectFiles    []*ObjectFile      // 输入的 .o 文件
	SymbolMap      map[string]*Symbol // 保存从 .o 文件中解析的参数
	MergedSections []*MergedSection   // 合并过的 Section
}

// NewContext Context 构造函数
func NewContext() *Context {
	return &Context{Args: ContextArgs{
		OutPut:       "a.out", // 默认输出 a.out 的可执行文件
		Emulation:    MachineTypeNone,
		LibraryPaths: nil,
	}, SymbolMap: make(map[string]*Symbol)}
}
